Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Find optimal interview slot #1271

Open
wants to merge 48 commits into
base: master
Choose a base branch
from
Open

Conversation

Snorre98
Copy link
Contributor

@Snorre98 Snorre98 commented Jul 22, 2024

make a post request to http://localhost:8000/allocate-interviews/{positionId}/ for a position where there are some applications, with interviewers and applicants available at least 24h in the future.

allocate interviews to blocks with the highest rating first

Plan for optimization

Rating will be based on 1) the number of available interviewers in the block, 2) num. of available interviewers in the preceding and succeeding blocks (if any), as well as 3) the time-length of the block.
Weighting of these factors will be important.

Demonstration:

Interviewers report unavailability in 30 min slots. From this availability is derived, and further time blocks are created which are differentiated by the count of interviewers available in the block.
In this system interviews would be allocated to the highest rated block first. As the blocks are filled the next highest rated block will be allocated interviews.

It is shown in the image bellow that the block at 20:00 to 20:30 where 4 interviewers are available would be filled before the block from 17:30 to 19:00, also where 4 interviewers are available.
This is because the first mentioned block is squeezed between two highly rated blocks.
The weighting and calculation can probably be adjusted for a more ergonomic interview schedule, but this is the gist of interview time blocks.
Screenshot from 2024-07-23 10-19-30

Showing time block rating calculation
Screenshot from 2024-07-23 10-19-41

Mail fra ISFiT:

  1. Hvordan bestemmes intervjutidspunkter/sted hos dere?
  2. Er det viktigst å minimere arbeidsmengden for de som organiserer intervjuene, eller for intervjuerne selv?
  3. Hvordan gjennomføres intervjuene? Er det intervjuer for én eller flere stillinger samtidig, og varierer dette mellom gruppe/seksjon/gjeng?
  4. Er det andre aspekter ved opptaks-prosessen deres vi burde kjenne til?
    1. Intervjutidspunkter har tidligere blitt bestemt ved at de som skal intervjue har avtalt tid seg i mellom, og deretter sendt mail til søker om dette kan passe. Her er det mye forbedringspotensiale. Det vi kanskje kunne ønsket var at det var en innebygd kalender på nettsiden der både intervjuere og kandidaten kan legge inn opptatt-tider/ledige tider for intervjuet. Litt som UKA har i JSS, men gjerne litt mer brukervennlig. Enten slik at begge parter legger inn sine ledige tider i systemet, og systemet selv setter opp intervju tid, eller at søkerne legger inn og intervjuere får innsyn i det og velger ut fra når de selv kan. Første alternativet er mer automatisert og krever mindre fra oss, så kanskje den som er mest aktuell.
    1. Denne er litt sånn “begge deler”-svar. Til nå så har opptaks-ansvarlige for hver seksjon ( 1 representant) kontinuerlig gått inn og sett om det har kommet søkere til deres seksjon. Deretter har de gitt relevante opplysninger om kandidaten til de som er ansvarlige for stillingene den har søkt. Jeg tror begge roller kan ha nytte av å få redusert arbeidsmengden. Jeg ser ikke for meg at noen av partene kan få noe særlig mer hvertfall.
    1. I Isfit så har søker mulighet til å prioritere stillinger, og det er gjerne intervjuere fra de to øverste prioriterte seksjonene som holder intervju. Det intervjues med andre ord på tvers av seksjoner og gjenger. Og det blir holdt 1stk intervju med representanter fra de ulike gjengene, i motsetning til samfundet og kanskje mer i likhet med UKA.
    1. Vi ønsker nok å implementere tilgangen intervjuere har til søkeren på lik linje med det UKA har i JSS. At intervjuernes "tilgang" til søkere legges inn på forhånd slik at systemet kan brukes både til å lese seg opp på hvilke intervjuer en har og med hvilke søkere. Selvfølgelig stegvis, slik at en kun får tilgang til den søker-gruppen som en skal intervjue. Dette burde være noe som administrator i systemet kan redigere og fordele tilganger på forhånd. Ellers hadde det vært fint å få vurderingen og fordeling av kandidater inn i systemet. Dette har til nå vært i masse forskjellige dokumenter hos oss. For oss er det da viktig at hver gjeng har mulighet til å vurdere sine søkere, og deretter kan rangere dem, og at vurderingen og rangeringen kobles videre til administrator hvor vi kan gjøre den endelige fordelingen. Vi ønsker også at søkertall, tidspunkt for søknader og aktivitet blir mulig å loggføre for statistikk. Om det hadde vært mulig å booke rom i tillegg i systemet så hadde det vært prima, men har også forståelse for at det kan bli litt mye.

#1134

@Snorre98 Snorre98 self-assigned this Jul 24, 2024
backend/samfundet/migrations/0004_merge_20240924_0058.py Outdated Show resolved Hide resolved
backend/samfundet/migrations/0006_merge_20240925_1842.py Outdated Show resolved Hide resolved
backend/samfundet/views.py Outdated Show resolved Hide resolved
backend/samfundet/migrations/0002_interviewtimeblock.py Outdated Show resolved Hide resolved
return True


def mark_applicant_unavailable(applicant, start_dt, end_dt, buffer_hours=2):
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Dette blir feil bruk av OccupiedTimeslot. Modellen er ment for brukerens egen utilgjengelighet uavhengig av opptaket. Systemet burde hente brukerens intervjuer automatisk istedenfor dette.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

henter intervjuer, så done

) # Return True if the interviewer is available


def mark_interviewers_unavailable(interviewers: list[Any], start_dt: datetime, end_dt: datetime, unavailability: defaultdict[Any, list]) -> None:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

list any?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done?

return block_interview_count


def allocate_single_interview(current_time, block, applications, interviewer_unavailability, position, interview_duration):
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

typer?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

@Snorre98 Snorre98 marked this pull request as ready for review October 20, 2024 13:15
Copy link
Contributor

@Mathias-a Mathias-a left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hadde det ikke bare funket med en greedy algoritme?

Comment on lines +11 to +14
UserIdType = int
TimeSlotType = tuple[datetime, datetime]

UnavailabilityTypeDict = dict[UserIdType, list[TimeSlotType]]
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Drop UserIdType and just add a comment

Suggested change
UserIdType = int
TimeSlotType = tuple[datetime, datetime]
UnavailabilityTypeDict = dict[UserIdType, list[TimeSlotType]]
TimeSlotType = tuple[datetime, datetime]
# int is user Id
UnavailabilityTypeDict = dict[int, list[TimeSlotType]]

def handle_allocation_error(self, error: InterviewAllocationError, interview_count: int = 0) -> Response:
error_responses = {
NoTimeBlocksAvailableError: ('No available time blocks for interviews.', status.HTTP_400_BAD_REQUEST),
NoApplicationsWithoutInterviewsError: ('No applications without interviews found.', status.HTTP_400_BAD_REQUEST),
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not really an error. If there's nothing to do, we're good

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants